package com.gitee.lougnib.simplekits.common_impls.spring_mvc;

import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.gitee.lougnib.simplekits.common_faces.web.event.EventResponseDto;
import com.gitee.lougnib.simplekits.common_faces.web.event.EventResponseKit;
import com.gitee.lougnib.simplekits.common_impls.logic.BaseRequestMapEventLogic;

public abstract class BaseRequestMapAngularEventController {
	/**
	 * 日志。
	 */
	protected final Logger log = LoggerFactory.getLogger(this.getClass());

	/**
	 * {@inheritDoc}
	 */
	public EventResponseDto handleRequest(String systemId, String moduleId, String screenId, String eventId,
			Map<String, Object> requestMap) {
		try {
			// 初始化输入对象
			initRequestMap(requestMap);

			BaseRequestMapEventLogic logic = createLogic(systemId, moduleId, screenId, eventId);

			Object data = null;
			if (logic != null) {
				data = logic.execute(requestMap);
			}

			return handleSuccess(requestMap, data);
		} catch (Exception e) {
			return handleException(requestMap, e);
		}
	}

	/**
	 * 初始化请求的对象。
	 *
	 * @param inputDto 接收到的原始请求对象
	 * @return 初始化后的请求对象
	 */
	protected Map<String, Object> initRequestMap(Map<String, Object> requestMap) {
		return requestMap;
	}

	/**
	 * 处理。
	 *
	 * @param inputDto 参数
	 * @param outDto   参数
	 * @param errors   错误信息
	 * @return 响应对象
	 */
	protected EventResponseDto handleSuccess(Map<String, Object> requestMap, Object outDto) {
		return EventResponseKit.success(outDto);
	}

	/**
	 * 返回响应结果。
	 *
	 * @param inputDto 参数
	 * @return 响应对象
	 */
	protected EventResponseDto handleException(Map<String, Object> inputDto, Exception ex) {
		// 只需记录系统异常的消息，业务异常和验证异常的消息无需记录。
		log.error(ex.getMessage(), ex);
		return EventResponseKit.error(ex.getMessage());
	}

	protected abstract BaseRequestMapEventLogic createLogic(String systemId, String moduleId, String screenId,
			String eventId);
}
